﻿  1 ﻿/*
  2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
  3 For licensing, see LICENSE.html or http://ckeditor.com/license
  4 */
  5 
  6 /**
  7  * @file AutoGrow plugin
  8  */
  9 (function(){
 10 
 11 	// Actual content height, figured out by appending check the last element's document position.
 12 	function contentHeight( scrollable )
 13 	{
 14 		var overflowY = scrollable.getStyle( 'overflow-y' );
 15 
 16 		var doc = scrollable.getDocument();
 17 		// Create a temporary marker element.
 18 		var marker = CKEDITOR.dom.element.createFromHtml( '<span style="margin:0;padding:0;border:0;clear:both;width:1px;height:1px;display:block;">' + ( CKEDITOR.env.webkit ? ' ' : '' ) + '</span>', doc );
 19 		doc[ CKEDITOR.env.ie? 'getBody' : 'getDocumentElement']().append( marker );
 20 
 21 		var height = marker.getDocumentPosition( doc ).y + marker.$.offsetHeight;
 22 		marker.remove();
 23 		scrollable.setStyle( 'overflow-y', overflowY );
 24 		return height;
 25 	}
 26 
 27 	var resizeEditor = function( editor )
 28 	{
 29 		if ( !editor.window )
 30 			return;
 31 
 32 		var doc = editor.document,
 33 			iframe = new CKEDITOR.dom.element( doc.getWindow().$.frameElement ),
 34 			body = doc.getBody(),
 35 			htmlElement = doc.getDocumentElement(),
 36 			currentHeight = editor.window.getViewPaneSize().height,
 37 			// Quirks mode overflows body, standards overflows document element
 38 			scrollable = doc.$.compatMode == 'BackCompat' ? body : htmlElement,
 39 			newHeight = contentHeight( scrollable );
 40 
 41 		// Additional space specified by user.
 42 		newHeight += ( editor.config.autoGrow_bottomSpace || 0 );
 43 
 44 		var min = editor.config.autoGrow_minHeight != undefined ? editor.config.autoGrow_minHeight : 200,
 45 			max = editor.config.autoGrow_maxHeight || Infinity;
 46 
 47 		newHeight = Math.max( newHeight, min );
 48 		newHeight = Math.min( newHeight, max );
 49 
 50 		if ( newHeight != currentHeight )
 51 		{
 52 			newHeight = editor.fire( 'autoGrow', { currentHeight : currentHeight, newHeight : newHeight } ).newHeight;
 53 			editor.resize( editor.container.getStyle( 'width' ), newHeight, true );
 54 		}
 55 
 56 		if ( scrollable.$.scrollHeight > scrollable.$.clientHeight && newHeight < max )
 57 			scrollable.setStyle( 'overflow-y', 'hidden' );
 58 		else
 59 			scrollable.removeStyle( 'overflow-y' );
 60 
 61 
 62 	};
 63 
 64 	CKEDITOR.plugins.add( 'autogrow',
 65 	{
 66 		init : function( editor )
 67 		{
 68 			editor.addCommand( 'autogrow', { exec : resizeEditor, modes : { wysiwyg:1 }, readOnly: 1, canUndo: false, editorFocus: false } );
 69 
 70 			var eventsList = { contentDom:1, key:1, selectionChange:1, insertElement:1, mode:1 };
 71 			editor.config.autoGrow_onStartup && ( eventsList[ 'instanceReady' ] = 1 );
 72 			for ( var eventName in eventsList )
 73 			{
 74 				editor.on( eventName, function( evt )
 75 				{
 76 					var maximize = editor.getCommand( 'maximize' );
 77 					// Some time is required for insertHtml, and it gives other events better performance as well.
 78 					if ( evt.editor.mode == 'wysiwyg' &&
 79 						// Disable autogrow when the editor is maximized .(#6339)
 80 						( !maximize || maximize.state != CKEDITOR.TRISTATE_ON ) )
 81 					{
 82 						setTimeout( function()
 83 						{
 84 							resizeEditor( evt.editor );
 85 							// Second pass to make correction upon
 86 							// the first resize, e.g. scrollbar.
 87 							resizeEditor( evt.editor );
 88 						}, 100 );
 89 					}
 90 				});
 91 			}
 92 		}
 93 	});
 94 })();
 95 /**
 96  * The minimum height that the editor can reach using the AutoGrow feature.
 97  * @name CKEDITOR.config.autoGrow_minHeight
 98  * @type Number
 99  * @default <code>200</code>
100  * @since 3.4
101  * @example
102  * config.autoGrow_minHeight = 300;
103  */
104 
105 /**
106  * The maximum height that the editor can reach using the AutoGrow feature. Zero means unlimited.
107  * @name CKEDITOR.config.autoGrow_maxHeight
108  * @type Number
109  * @default <code>0</code>
110  * @since 3.4
111  * @example
112  * config.autoGrow_maxHeight = 400;
113  */
114 
115  /**
116  * Whether to have the auto grow happen on editor creation.
117  * @name CKEDITOR.config.autoGrow_onStartup
118  * @type Boolean
119  * @default false
120  * @since 3.6.2
121  * @example
122  * config.autoGrow_onStartup = true;
123  */
124 
125 /**
126  * Fired when the AutoGrow plugin is about to change the size of the editor.
127  * @name CKEDITOR.editor#autogrow
128  * @event
129  * @param {Number} data.currentHeight The current height of the editor (before resizing).
130  * @param {Number} data.newHeight The new height of the editor (after resizing). It can be changed
131  *				to determine a different height value to be used instead.
132  */
133 
134 
135 /**
136  *  Extra height in pixel to leave between the bottom boundary of content with document size when auto resizing.
137  * @name CKEDITOR.config.autoGrow_bottomSpace
138  * @type Number
139  * @default 0
140  * @since 3.6.2
141  */
142 